﻿using System;
using System.Security.Cryptography;
using Business.Entity.Contabil;
using Business.Entity.Estoque.Produto;
using Business.Entity.Sped;
using Business.Entity.Vendas.MovimentacaoCaixa.SubClass.RecebimentoVenda;
using Business.Entity.Vendas.Pedido.ClassesRelacionadas;
using Business.Entity.Vendas.Pedido.Restaurante;
using Business.Enum;
using NHibernate;

namespace Business.Entity.Vendas.Pedido
{
    public class PedidoRepository : RepositoryBase<Pedido>
    {

        



        

        private static string CriaDocumento(Pedido pedido, int parcela)
        {
            return "P" + pedido.Id + "-" + parcela + "/" + pedido.Pagamento.Count;
        }

        internal static string CriaHistorico(Pedido pedido)
        {
            return "Recebimento efetuado por sucesso do pedido: " + pedido.Id;
        }

        internal static Lancamento CriaLancamento(Pedido pedido, string historico)
        {

            return new Lancamento()
            {
                DataLancamento = pedido.DataPedido,
                Historico = historico,
                Pessoa = pedido.Cliente,
                Vencimento = pedido.DataPedido,
            };
        }

        internal static void DeterminarPartida(Lancamento lanc, Produto prod, FormaPagamento formaPag)
        {

            switch (prod.Tipo)
            {
                case TipoProduto.Mercadoria:
                    lanc.TipoLancmento = formaPag.TipoLancamentoMercadoria;
                    LancamentoRepository.GeraPartida(lanc);
                    break;
                case TipoProduto.Produto:
                    lanc.TipoLancmento = formaPag.TipoLancamentoProduto;
                    LancamentoRepository.GeraPartida(lanc);
                    break;
                case TipoProduto.Servico:
                    lanc.TipoLancmento = formaPag.TipoLancamentoServico;
                    LancamentoRepository.GeraPartida(lanc);
                    break;
            }
        }

        

        internal static Boolean LancaTitulo(PagamentoPedido pag)
        {
            return LancaTituloInTransaction(pag, Session);
        }
        public static Boolean LancaTituloInTransaction(PagamentoPedido pag, ISession session)
        {
            if (pag.FormaPagamento.ExigeIdentificacaoCliente || !pag.FormaPagamento.AVista)
            {
                if (pag.Pedido.Cliente == Utils.Configuracao.PessoaPadrao)
                {
                    throw new Exception("É necessário informar o cliente que está pagando para " +
                          "a forma de pagamento '" + pag.FormaPagamento.Descricao + "'.");
                }
            }
            var titulo = new Titulo()
            {
                DataLancamento = pag.Pedido.DataPedido,
                DataVencimento = pag.Vencimento,
                Historico = CriaHistorico(pag.Pedido),
                NotaFiscal = pag.Pedido.NotaFiscal,
                NumeroOrdem = CriaDocumento(pag.Pedido, pag.Parcela),
                Pessoa = pag.Pedido.Cliente,
                Valor = pag.Valor,
                Juros = pag.Juros,
                TipoLancamento = pag.FormaPagamento.TipoTitulo
            };
            try
            {
                session.Save(titulo);
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        
    }
}
